package com.qfedu.bigdataapp.fragment;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;

import com.alibaba.fastjson.JSON;
import com.qfedu.bigdataapp.Const;
import com.qfedu.bigdataapp.R;
import com.qfedu.bigdataapp.adapter.NewsTopicAdapter;
import com.qfedu.bigdataapp.bean.NewsResult;
import com.qfedu.bigdataapp.bean.NewsReturnData;

import org.json.JSONObject;
import org.xutils.HttpManager;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;

/**
 * 该类是发现Fragment的类
 */
public class DiscoverFragment extends Fragment {
    private ListView lvNewsTopic;
    private NewsTopicAdapter newsTopicAdapter;
    private int PAGE = 1;

    private int firstItem, itemCount, totalItem;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_discover, container, false);
        lvNewsTopic = rootView.findViewById(R.id.lv_newstopic);
        //设置对ListView的监听
        setListener();
        return rootView;
    }

    private void setListener() {
        //添加滑动监听
        lvNewsTopic.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int scrollState) {
                System.out.println("滑动状态：" + scrollState);
                //Scroll滑动状态
                //SCROLL_STATE_IDLE: 空闲的,没有使用的状态
                //SCROLL_STATE_TOUCH_SCROLL：手指按在屏幕上，滑动时
                //SCROLL_STATE_FLING：松开手之后，停止之前的 惯性滑动状态
                switch (scrollState) {
                    case SCROLL_STATE_IDLE://空闲状态
                        //为了降低敏感度，当litView处于idle时，判断是否到底了
                        //如果到最后一个item了，就开始发起网络请求
                        if (firstItem + itemCount == totalItem && totalItem > 0) {
                            netRequest();//分页加载下一页的数据
                        }
                        break;
                    case SCROLL_STATE_TOUCH_SCROLL://按住手指滑动状态
                        break;
                    case SCROLL_STATE_FLING://自由滑动状态
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onScroll(AbsListView absListView, int firstVisableItem, int visableItemCount, int totalItemCount) {
                System.out.println("首个可见的条目：" + firstVisableItem + ",可见条目的个数：" + visableItemCount + ",条目总个数：" + totalItemCount);
                //分页请求：
                //分析：当ListView向上滑动，最后一个数据条目出现在屏幕中时，开始发起下一页数据的网络请求，请求回来后把请求到的数据更新到ListView当中，方便进行展示
                //根据日志分析：当firstVisableItem + visableItemCount = totalItemCount时，就代表最后一个条目已经出现了，该进行下一页数据的请求了
//                if (firstVisableItem + visableItemCount == totalItemCount && totalItemCount > 0) {
//                    netRequest();//分页加载下一页的数据
//                }
                firstItem = firstVisableItem;
                itemCount = visableItemCount;
                totalItem = totalItemCount;
            }

        });
    }

    @Override
    public void onStart() {
        super.onStart();
        //发起网络请求，去请求头条新闻数据
        netRequest();
    }

    /**
     * 网络请求方法
     */
    private void netRequest() {
        //发起网络请求，请求新闻头条数据，得到结果后，进行展示
        HttpManager httpManager = x.http();
        RequestParams params = new RequestParams(Const.NEWSTOPIC_URL);
        //设置请求头信息的
        params.addHeader("Content-Type", "application/x-www-form-urlencoded");

        //添加参数
        params.addParameter("key", Const.NEWSTOPIC_KEY);
        params.addParameter("type", "top");//使用默认的top
        //i++ 和 ++i的区别是什么？
        params.addParameter("page", PAGE++);//从第1页数据开始获取
        params.addParameter("page_size", Const.PAGE_SIZE);//设置每次请求数据的条数
        params.addParameter("is_filter", 0);//不需要新闻详情

        httpManager.get(params, new Callback.CommonCallback<JSONObject>() {
            @Override
            public void onSuccess(JSONObject result) {
                //请求成功时会回调的方法
                System.out.println(result.toString());
                //使用fastjson库解析json数据，得到Java对象
                NewsReturnData newsReturnData = JSON.parseObject(result.toString(), NewsReturnData.class);
                //展示解析到的数据
                showReturnData(newsReturnData.getResult());
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                //请求发生错误的时候会回调的方法
                System.out.println(ex.getMessage());
            }

            @Override
            public void onCancelled(CancelledException cex) {
                //用户取消的时候会回调执行的方法
                System.out.println(cex.getMessage());
            }

            @Override
            public void onFinished() {
                // TODO: 2023/4/23 一定会走onFinished方法
            }
        });
    }

    /**
     * 该方法用于将网络请求得到的结果，展示到ListView当中
     *
     * @param result 返回的数据
     */
    private void showReturnData(NewsResult result) {
        //分析：listview展示数据，需要adapter配合
        if (newsTopicAdapter == null) {//如果adapter为空，则意味着首次执行网络请求
            //需要先创建adapter对象，并为listiew适配器
            newsTopicAdapter = new NewsTopicAdapter(getContext(), result.getData());
            lvNewsTopic.setAdapter(newsTopicAdapter);
        } else {//否则，即其他情况：后续的分页加载
            //分页加载时，需要将分页获取到的数据，追加到已有数据的后面
            newsTopicAdapter.addNewData(result.getData());
            //更新适配器
            newsTopicAdapter.notifyDataSetChanged();
        }

    }
}